package arithmetic;

import java.util.Scanner;


public class bubbleSortMain{


	private static int addNum(int x,int y) {
		
		/**
		 * @author Ming
		 *        X
		 *        Y
		 *        计算X与Y之和
		 */
		//返回语句
	    int num=x+y;
		return num;
		
	}
	private static void showMe(int x,int y) {
		/**
		 * @author Ming
		 *      
		 *      无返回值  
		 *        
		 */
		//返回语句
		System.out.println("无返回值");
		return ;
		
	}
	/**
	 * 冒泡排序的第一种方式
	 * @param arr
	 */
 private static void bubbleSort(int[] arr) {
		//计算交换次数、设置初值为0
		int count=0;
		//外层循环
		for(int k=0;k<arr.length-1;k++) {
			//内层循环为一轮检测位置
			for(int i=0;i<arr.length-1;i++) {
				//判断前面的是否比后面的大
			if(arr[i]>arr[i+1]) {
				//如果前面比后面的大就将调换位置
				int temp;
				temp=arr[i];
				arr[i]=arr[i+1];
				arr[i+1]=temp;	
			    }
			//调换一次为位置计数器加一
			count++;
			}
		}
		System.out.println(count);
		//输出排序后的数组
		printArr(arr);
	
	}
	/**
	 * 冒泡排序的第二种方式
	 * 被排序数组【方法定义为了void，因为数组是按引用传参】
	 * @param arr
	 */
	private static void bubbleSort2(int[] arr) {
		//计算交换次数、设置初值为0
		int count=0;
		//外层循环
		for(int k=0;k<arr.length-1;k++) {
			//内层循环为一轮检测位置
			for(int i=0;i<arr.length-i-1;i++) {
				//判断前面的是否比后面的大
			if(arr[i]>arr[i+1]) {
				//如果前面比后面的大就将调换位置
				int temp;
				temp=arr[i];
				arr[i]=arr[i+1];
				arr[i+1]=temp;
			    }
			//调换一次为位置计数器加一	
			count++;
			}
		}
		System.out.println(count);
		//输出排序后的数组
		printArr(arr);
	}
	/**
	 * 冒泡排序的第三种方式
	 * 被排序数组【方法定义为了void，因为数组是按引用传参】
	 * @param arr
	 */
	private static void bubbleSort3(int[] arr) {
		//计算交换次数、设置初值为0
		int count=0;
		//外层循环
		for(int k=0;k<arr.length-1;k++) {
			boolean isChange=false;
			//内层循环为一轮检测位置
			for(int i=0;i<arr.length-i-1;i++) {
				//判断前面的是否比后面的大
			if(arr[i]>arr[i+1]) {
				//如果前面比后面的大就将调换位置
				int temp;
				temp=arr[i];
				arr[i]=arr[i+1];
				arr[i+1]=temp;
				//换位过后赋值为true表示进行过换位
				isChange=true;
			    }
			//调换一次为位置计数器加一
			count++;
			}
			// 如果当前轮没有发生交换，则无需在进行下一轮比较，可以终止比较轮数的循环【终止外层循环】
			if(isChange==false) {
				break;
		}

		}
		System.out.println(count);
		//输出排序后的数组
		printArr(arr);
	}
//循环输出数组
	private  static void printArr(int[] arr) {
		for (int i : arr) {
			System.out.print(" "+i);
		}
		System.out.println();
	}
public static void main(String[] args) {
	//为冒泡排序定义数组
	int [] arr=new int[] {4,11,12,7,8,9,3,2,1};
	bubbleSort(arr);
	bubbleSort2(arr);
	bubbleSort3(arr);

}
}

